import { arrMethods } from '../array'

// 功能封装该类上
class Observer {
  constructor(data) {
    // 循环引用
    // data.__ob__ = this
    Object.defineProperty(data, '__ob__', {
      value: this,
      enumerable: false,
      configurable: false,
    })
    if (Array.isArray(data)) {
      // console.log(data)
      data.__proto__ = arrMethods
      this.observeArray(data)
    } else {
      this.walk(data)
    }
  }

  // 运行劫持的逻辑
  walk(data) {
    Object.keys(data).forEach((key) => {
      defineReactive(data, key, data[key])
    })
  }

  observeArray(data) {
    data.forEach((item) => {
      observe(item)
    })
  }
}
// defineReactive中进行数据劫持
function defineReactive(data, key, value) {
  observe(value)
  Object.defineProperty(data, key, {
    get() {
      console.log('数据劫持到了_data过来的get')
      return value
    },
    set(val) {
      console.log('数据劫持到了set')
      observe(value)
      value = val
    },
  })
}

export default function observe(data) {
  // 如果data不是一个对象 不需要劫持
  if (typeof data !== 'object' || data === null) return
  if (data.__ob__) return
  new Observer(data)
}
